/*
 * 百度在线网络技术（北京）有限公司拥有本软件版权2021并保留所有权利。
 * Copyright 2021, Baidu.com,Inc 2:Baidu Online Network Technology (Beijing) Co.,Ltd,
 * All rights reserved.
 */

package com.azdebugit.moshi.test.learn;

/**
 * @Description: 内部静态类是要在有引用了以后才会装载到内存的。
 * 所以在你第一次调用getInstance()之前，SingletonHolder是没有被装载进来的，
 * 只有在你第一次调用了getInstance()之后，里面涉及到了return SingletonHolder.instance; 产生了对SingletonHolder的引用，内部静态类的实例才会真正装载。这也就是懒加载的意思。
 * <p>
 * 关于 “JVM来保证线程的安全性” 这句话的意思：
 * 利用了classloader的机制来保证初始化instance时只有一个线程，所以也是线程安全的，同时没有性能损耗。
 * @Param: @param
 * @return:
 * @Author: itdebug
 * @Date: 2021/1/29
 */
public class InstanceInnerClass {
    private String str;
    private Long currentTime;

    private static class InnerClass {
        private static final InstanceInnerClass instance = new InstanceInnerClass();
    }

    public static InstanceInnerClass getInstance() {
        return InnerClass.instance;
    }

    private InstanceInnerClass() {
        initProperties();
    }

    private void initProperties() {
        this.str = "hello world!";
        this.currentTime = System.currentTimeMillis();
    }

    public void print() {
        System.out.println("time:" + currentTime + " >>> " + str);
    }

    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    InstanceInnerClass instance = InstanceInnerClass.getInstance();
                    System.out.println("hashCode:" + instance.hashCode());
                    instance.print();
                }
            }).start();
        }
    }
}